package excel;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description: TODO
 * @Author: wzj
 * @Date: 2019/9/27 16:39
 */
public class ExcelUtils {
    // 默认单元格内容为数字时格式
    private static DecimalFormat df = new DecimalFormat("0");
    // 默认单元格格式化日期字符串
    private static SimpleDateFormat sdf = new SimpleDateFormat(  "yyyy-MM-dd HH:mm:ss");
    // 格式化数字
    private static DecimalFormat nf = new DecimalFormat("0.00");

    /**
     *
     * @param file 读取的excel文件
     * @param startRowIndex 读取的起始行下标(第一行为0，以此类推)
     * @return
     * @throws IOException
     */
    public static List<List<Object>> readExcel(File file,int startRowIndex) throws IOException {
        if(file==null){
            return null;
        }
        List<List<Object>> rowList=new ArrayList<>();//行
        String suffix=file.getName().substring(file.getName().lastIndexOf("."));
        Workbook wb;
        if(suffix.equals("xls")){ //2003
            wb = new HSSFWorkbook(new FileInputStream(file));
        } else { //2007
            wb = new XSSFWorkbook(new FileInputStream(file));
        }
        List<Object> colList;//列
        //获取sheet工作表个数
        /*int sheetNumber=wb.getNumberOfSheets();
        for(int i=0;i<sheetNumber;i++){
            Sheet sheet=wb.getSheetAt(i);
        }*/
        Sheet sheet=wb.getSheetAt(0);//获取第一个sheet工作表
        //获取最后一个不是null的行的下标（从0开始数）
        //（如果第一行是插入的空行，则第一行为null。如果最后一行内容清除为空的，表示此行为空，除非删除，才表示行为null）
        int rowNumber=sheet.getLastRowNum();
        //获取不是null的行的数量
        //int rowNumber1=sheet.getPhysicalNumberOfRows();
        //System.out.println(rowNumber+"行"+rowNumber1);
        //工作表行
        Row row;
        Cell cell;
        Object value;//单元格值
        for (int i = startRowIndex; i <= rowNumber; i++) {
            colList=new ArrayList<>();
            System.out.println(i+"行***************************");
            row=sheet.getRow(i);
            if(row!=null){
                int cellNumber=row.getLastCellNum();//获取一行中最后一个不是null的单元格的物理位置（从1开始数）
                //int cellNumber1=hssfRow.getPhysicalNumberOfCells();//获取行中不是null的单元格数量
                //System.out.println(i+"行"+cellNumber+"列"+cellNumber1);
                for(int j=0;j<cellNumber;j++){
                    cell=row.getCell(j);
                    if(cell!=null){
                        if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){//字符串
                            value=cell.getStringCellValue();
                            System.out.println(value+"-字符串列"+j);
                        }
                        else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
                            value=cell.getNumericCellValue();
                            System.out.println(value+"-数字列"+j);
                        }
                        else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){
                            value=cell.getCellFormula();
                            System.out.println(value+"-公式列"+j);
                        }
                        else if(cell.getCellType()==HSSFCell.CELL_TYPE_ERROR){
                            value=cell.getErrorCellValue();
                            System.out.println(value+"-错误列"+j);
                        }
                        else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
                            value=cell.getBooleanCellValue();
                            System.out.println(value+"-布尔列"+j);
                        }
                        else if(cell.getCellType()==XSSFCell.CELL_TYPE_BLANK){
                            value=cell.getStringCellValue();
                            System.out.println("空-"+value+"-空列"+j);
                        }
                        else{
                            value=null;
                            System.out.println(cell.getCellType()+"-cellType列"+j);
                        }
                    }
                    else{
                        value=null;
                        System.out.println("cell is null 列"+j);
                    }
                    colList.add(value);
                }
                rowList.add(colList);
            }
        }
        return rowList;
    }
    /**
     * 导出到Excel，单元格格式全部为String
     * @param list List<List> 外围List表示行，内部List表示列
     * @param filepath eg：C:\\Users\\007\\Desktop\\1.xlsx
     */
    public static void writeExcel(List<List<Object>> list, String filepath){
        if(list == null){
            return;
        }
        String suffix=filepath.substring(filepath.lastIndexOf(".")+1);
        Workbook wb;
        if(suffix.equals("xls")){ //2003
            wb = new HSSFWorkbook();
        } else { //2007
            wb = new XSSFWorkbook();
        }
        Sheet sheet = wb.createSheet("sheet1");
        for(int i = 0 ;i < list.size() ; i++){
            Row row = sheet.createRow(i);
            if(list.get(i) != null){
                for(int j = 0; j < list.get(i).size() ; j ++){
                    Cell cell = row.createCell(j);
                    if(list.get(i).get(j)!=null){
                        cell.setCellValue(list.get(i).get(j).toString());
                    } else {
                        cell.setCellValue("");
                    }
                }
            }
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try
        {
            wb.write(bos);
        } catch (IOException e){
            e.printStackTrace();
        }
        byte[] content = bos.toByteArray();
        File file = new File(filepath);//Excel文件生成后存储的位置。
        OutputStream os;
        try
        {
            os = new FileOutputStream(file);
            os.write(content);
            bos.close();
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static DecimalFormat getDf() {
        return df;
    }
    public static void setDf(DecimalFormat df) {
        ExcelUtils.df = df;
    }
    public static SimpleDateFormat getSdf() {
        return sdf;
    }
    public static void setSdf(SimpleDateFormat sdf) {
        ExcelUtils.sdf = sdf;
    }
    public static DecimalFormat getNf() {
        return nf;
    }
    public static void setNf(DecimalFormat nf) {
        ExcelUtils.nf = nf;
    }


}
